package it.pecuswap.thread;

import org.apache.log4j.Logger;

import it.pecuswap.client.rest.service.ConfigurazioneServiceClient;
import it.pecuswap.commons.exceptions.PecuswapRestException;
import it.pecuswap.commons.utils.ConfigurationKeys;
import it.pecuswap.configuration.Configuration;
import it.pecuswap.exceptions.ConfigurationException;

/**
 * Thread che si occupa di recuperare le properties di backend controllando che quest'ultimo sia disponibile.
 * La sua esecuzione deve iniziare dopo quella del monitoring backend
 * @author Ruggiero
 *
 */
public class MergePropertiesThread implements Runnable {
	
	private static final Logger LOGGER = Logger.getLogger(MergePropertiesThread.class);
	private int pollingTime = 0;

	@Override
	public void run() {
		
		try {
			pollingTime = Integer.valueOf(Configuration.getInstance().getValueOf(ConfigurationKeys.BACKEND_PROPERTIES_SERVICE_POLLING_INTERVAL));
		} catch (NumberFormatException | ConfigurationException e1) {
			LOGGER.error("Errore di configurazione. Thread stoppato.");
		}
		
		BackendMonitorThread bmt = BackendMonitorThread.getInstance();
		while (!bmt.isBackendAvailable()){
			try {
				LOGGER.debug("Backend non disponibile. Properties di backend non disponibili.");
				Thread.sleep(pollingTime);
			} catch (InterruptedException e) {
				LOGGER.error("Errore generico. Thread stoppato.");
			}
		}
		ConfigurazioneServiceClient csc;
		try {
			csc = new ConfigurazioneServiceClient();
			Configuration.getInstance().mergePropertiesFromBackend(csc.getProperties());
			LOGGER.debug("Backend disponibile. Properties di backend disponibili.");
		} catch (ConfigurationException | PecuswapRestException e) {
			LOGGER.error("Errore generico. Thread stoppato.");
		}
		
	}

}
